/*
 * ArbolBB.cpp
 *
 *  Created on: 15/10/2011
 *      Author: diego
 */

#include "ArbolBB.h"

ArbolBB::ArbolBB() {
	this->raiz = NULL;
	this->cant_nodos = 0;
}


bool ArbolBB::esIgual(nodo_t* nodo1, nodo_t* nodo2){
	return (*nodo1).termino->compare((*nodo2).termino->c_str()) == 0;
}

bool ArbolBB::esIgual(nodo_t* nodo, string* termino){
	if (nodo != NULL){
		return ((*nodo).termino->compare(termino->c_str()) == 0);
	}

	return false;
}

bool ArbolBB::agregarTermino(string* termino){
	nodo_t* nodo = (nodo_t*) malloc(sizeof(nodo_t));
	if (nodo == NULL){
		return false;
	}

	nodo->termino = termino;
	nodo->frec_t = 1;
	nodo->hijoDer = NULL;
	nodo->hijoIzq = NULL;

	if (this->raiz == NULL){
		this->raiz = nodo;
		return true;
	}


	nodo_t* nodoActual = this->raiz;
	nodo_t* nodoAnterior = this->raiz;

	while(nodoActual != NULL && !this->esIgual(nodoActual, termino)){
		nodoAnterior = nodoActual;
		nodoActual = this->getProximo(nodoActual, termino);
	}

	if (nodoActual == NULL){

		if (termino->compare(nodoAnterior->termino->c_str()) < 0){
			// termino es menor que el termino del nodo
			nodoAnterior->hijoIzq = nodo;
		}else{
			// termino es mayor que el termino del nodo
			nodoAnterior->hijoDer = nodo;
		}

		this->cant_nodos++;

	}else{
		nodoActual->frec_t++;
	}

	return true;

}

nodo_t* ArbolBB::getProximo(nodo_t* nodo, string* termino){
	// supongo que termino es distinto del termino del nodo
	if (termino->compare(nodo->termino->c_str()) < 0){
		// termino es menor que el termino del nodo
		return nodo->hijoIzq;
	}else{
		// termino es mayor que el termino del nodo
		return nodo->hijoDer;
	}
}

int ArbolBB::getCantNodos(){
	return this->cant_nodos;
}

ArbolBB::~ArbolBB() {
	if (this->raiz != NULL){
		delete this->raiz;
	}
}

